﻿using Core.Domain.Entities;
using Finbuckle.MultiTenant;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Infrastructure.Persistence.Configurations;

public class UserOrganizationConfiguration : IEntityTypeConfiguration<UserOrganization>
{
    public void Configure(EntityTypeBuilder<UserOrganization> builder)
    {
        // 1. 表名与架构设置（支持 Schema 分离）
        builder
           .ToTable("UserOrganizations", schema: "identity")
           .IsMultiTenant();

        // 2. 主键定义
        builder.HasKey(uo => uo.Id);

        // 3. 枚举映射：将 OrganizationPosition 存储为数据库中的 VARCHAR 字符串（更可读）
        builder.Property(uo => uo.Position)
               .HasConversion<string>()           // 以字符串形式存储，如 "Owner" 而非 6 [4]
               .HasMaxLength(50)                  // 防止过长字符串写入
               .IsRequired()
               .HasColumnName("Position");       // 显式指定列名

        // 4. 外键关系配置 —— 引用 User 实体
        builder.HasOne(u => u.User)             // 每个 UserOrganization 关联一个 User
               .WithMany(uo => uo.UserOrganizations)                        // 
               .HasForeignKey(uo => uo.UserId)
               .OnDelete(DeleteBehavior.Restrict);  // 当用户被删除时，自动清理其组织关系

        // 5. 外键关系配置 —— 引用 Organization 实体
        builder.HasOne(o => o.Organization)
               .WithMany(uo => uo.UserOrganizations)
               .HasForeignKey(uo => uo.OrganizationId)
               .OnDelete(DeleteBehavior.Restrict);

        // 6. 索引优化查询性能
        builder.HasIndex(uo => new { uo.UserId, uo.OrganizationId })
               .HasDatabaseName("IX_UserOrganizations_UserId_OrganizationId");

        builder.HasIndex(uo => uo.OrganizationId)
               .HasDatabaseName("IX_UserOrganizations_OrganizationId");
    }
}
